
public class Main{
	public static void main(String[]args){
		Monticulo monticulo=new Monticulo();
		Camino solucion=new Camino();
		/*
		 
		System.out.println("Mapa 10x10 - A* euclidea:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "A*", 0, 0, 0, "euclidea");
		System.out.println(solucion.toString());
		
		System.out.println("Mapa 10x10 - A* manhattan:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "A*", 0, 0, 0, "manhattan");
		System.out.println(solucion.toString());
		
		System.out.println("Mapa 15x15 - A* euclidea:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "A*", 0, 0, 0, "euclidea");
		System.out.println(solucion.toString());
		
		System.out.println("Mapa 15x15 - A* manhattan:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "A*", 0, 0, 0, "manhattan");
		System.out.println(solucion.toString());
		
		System.out.println("Mapa 10x10 - costo uniforme:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "costoUniforme", 0, 0, 0, "");
		System.out.println(solucion.toString());
		
		System.out.println("Mapa 15x15 - costo uniforme:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "costoUniforme", 0, 0, 0, "");
		System.out.println(solucion.toString());
		
		
		
		/* Ejemplo 1 
		System.out.println("Mapa 10x10 - profundidad:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "profundidad", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 10x10 - profundidad acotada:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "profundidadAcotada", 15, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 10x10 - profundidad acotada iterativa:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "profundidadIterativa", 15, 5, 3, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 10x10 - costo uniforme:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "costoUniforme", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 10x10 - anchura:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "anchura", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 10x10 - A* euclidea:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "A*", 0, 0, 0, "euclidea");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 10x10 - A* manhattan:");
		solucion=monticulo.busqueda("res/mapa10x10.png", new Posicion(0,0), new Posicion(9,9), "A*", 0, 0, 0, "manhattan");
		System.out.println(solucion.toString3());

		/* Ejemplo 2 
		System.out.println("Mapa 15x15 - profundidad:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "profundidad", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 15x15 - profundidad acotada:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "profundidadAcotada", 25, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 15x15 - profundidad acotada iterativa:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "profundidadIterativa", 12, 3, 7, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 15x15 - costo uniforme:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "costoUniforme", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 15x15 - anchura:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "anchura", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 15x15 - A* euclidea:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "A*", 0, 0, 0, "euclidea");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 15x15 - A* manhattan:");
		solucion=monticulo.busqueda("res/mapa15x15.png", new Posicion(0,0), new Posicion(14,14), "A*", 0, 0, 0, "manhattan");
		System.out.println(solucion.toString3());
		*/
		/* Ejemplo 3 
		System.out.println("Mapa 50x50 - profundidad:");
		solucion=monticulo.busqueda("res/mapa50x50.png", new Posicion(0,0), new Posicion(49,49), "profundidad", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 50x50 - profundidad acotada:");
		solucion=monticulo.busqueda("res/mapa50x50.png", new Posicion(0,0), new Posicion(49,49), "profundidadAcotada", 100, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 50x50 - profundidad acotada iterativa:");
		solucion=monticulo.busqueda("res/mapa50x50.png", new Posicion(0,0), new Posicion(49,49), "profundidadIterativa", 15, 10, 10, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 50x50 - costo uniforme:");
		solucion=monticulo.busqueda("res/mapa50x50.png", new Posicion(0,0), new Posicion(49,49), "costoUniforme", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 50x50 - anchura:");
		solucion=monticulo.busqueda("res/mapa50x50.png", new Posicion(0,0), new Posicion(49,49), "anchura", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 50x50 - A* euclidea:");
		solucion=monticulo.busqueda("res/mapa50x50.png", new Posicion(0,0), new Posicion(49,49), "A*", 0, 0, 0, "euclidea");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 50x50 - A* manhattan:");
		solucion=monticulo.busqueda("res/mapa50x50.png", new Posicion(0,0), new Posicion(49,49), "A*", 0, 0, 0, "manhattan");
		System.out.println(solucion.toString3());
		
		/* Ejemplo 4 
		System.out.println("Mapa 100x100 - profundidad:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(99,99), "profundidad", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 100x100 - profundidad acotada:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(99,99), "profundidadAcotada", 200, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 100x100 - profundidad acotada iterativa:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(99,99), "profundidadIterativa", 25, 25, 10, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 100x100 - costo uniforme:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(99,99), "costoUniforme", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 100x100 - anchura:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(99,99), "anchura", 0, 0, 0, "");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 100x100 - A* euclidea:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(9,9), "A*", 0, 0, 0, "euclidea");
		System.out.println(solucion.toString3());
		System.out.println("Mapa 100x100 - A* manhattan:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(9,9), "A*", 0, 0, 0, "manhattan");
		System.out.println(solucion.toString3());
		/* Guarda la solucion
		
		System.out.println("Mapa 100x100 - profundidad:");
		solucion=monticulo.busqueda("res/mapa100x100.png", new Posicion(0,0), new Posicion(99,99), "profundidad", 0, 0, 0, "");
		System.out.println(solucion.toString());
		System.out.println("\nAlmacenamiento en memoria --------\n");
		solucion.save("SolucionProfundidad.txt");
		
		/* Carga la solucion
		System.out.println("\nCarga desde memoria --------\n");
		solucion.load("SolucionProfundidad.txt");
		System.out.println(solucion.toString());
		
		System.out.println("------------------------------------------------------");
		*/
		/* Analiza una solucion dibujada en una imagen
		System.out.println("Analizando Solucion");
		solucion=monticulo.getSolucion("res/solucion100x100.png");
		System.out.println(solucion.toString());
		System.out.println("----------------------------\nValorando Solucion");
		double valoracion=monticulo.val(solucion, "res/mapa100x100.png");
		System.out.println("Valoracion: " + valoracion);
		
		System.out.println("------------------------------------------------------");
		
		
		/* Borramos parte de la solucion y la restauramos
		System.out.println("Eliminando un nodo de la solucion Solucion");
		Posicion cortei=solucion.getCamino().get(9).getPos(), corte=solucion.getCamino().get(10).getPos(), 
				cortef=solucion.getCamino().get(11).getPos();
		solucion.eliminaNodo(corte);
		System.out.println(solucion.toString());
		
		System.out.println("Restaurando el camino");
		solucion=monticulo.restaurarCamino(solucion, cortei, cortef, "res/mapa100x100.png");
		System.out.println(solucion.toString());
		
		System.out.println("------------------------------------------------------");
		
		System.out.println("Eliminando un circulo dentro de la solucion Solucion");
		solucion.eliminaCirculo(new Posicion(10,1), 3);
		System.out.println(solucion.toString());
		System.out.println("Restaurando la solucion");
		solucion=monticulo.restaurarSolucion(solucion, "res/mapa100x100.png");
		System.out.println(solucion.toString());
		
		*/
		
		double valoracion, valColinas, valTemple;
		Camino colinas, temple;
		
		/* 10x10 -------------------------------------------------------------------------------- */
		/* Analiza una solucion dibujada en una imagen 
		System.out.println("Analizando Solucion");
		solucion=monticulo.getSolucion("res/solucion10x10.png");
		System.out.println("----------------------------\nValorando Solucion");
		valoracion=monticulo.val(solucion, "res/mapa10x10.png");
		System.out.println("Valoracion: " + valoracion);
		System.out.println(solucion.toString2(10, 10));
		
		/* Se le aplica el algoritmo del ascenso de colinas 
		System.out.println("---------------------------------\nAscenso de colinas\n---------------------------------");
		colinas=monticulo.ascensoColinas("res/mapa10x10.png", solucion);
		
		valColinas=monticulo.val(colinas, "res/mapa10x10.png");
		System.out.println("Valoracion: " + valColinas);
		//System.out.println(colinas.toString2(10, 10));
		System.out.println(colinas.toString3());
		
		/* Se le aplica el algoritmo del temple simulado  
		System.out.println("---------------------------------\nTemple Simulado\n---------------------------------");
		temple=monticulo.templeSimulado("res/mapa10x10.png", solucion, 4);
		
		valTemple=monticulo.val(temple, "res/mapa10x10.png");
		System.out.println("Valoracion: " + valTemple);
		//System.out.println(temple.toString2(10, 10));
		System.out.println(temple.toString3());
		*/
		
		/* 50x50 ---------------------------------------------------------------------------- */
		/* Analiza una solucion dibujada en una imagen 
		System.out.println("Analizando Solucion");
		solucion=monticulo.getSolucion("res/solucion50x50.png");
		System.out.println("----------------------------\nValorando Solucion");
		valoracion=monticulo.val(solucion, "res/mapa50x50.png");
		System.out.println("Valoracion: " + valoracion);
		//System.out.println(solucion.toString2(50, 50));
		
		/* Se le aplica el algoritmo del ascenso de colinas 
		System.out.println("---------------------------------\nAscenso de colinas\n---------------------------------");
		colinas=monticulo.ascensoColinas("res/mapa50x50.png", solucion);
		
		valColinas=monticulo.val(colinas, "res/mapa50x50.png");
		System.out.println("Valoracion: " + valColinas);
		//System.out.println(colinas.toString2(50, 50));
		System.out.println(colinas.toString3());
		
		/* Se le aplica el algoritmo del temple simulado  
		System.out.println("---------------------------------\nTemple Simulado\n---------------------------------");
		temple=monticulo.templeSimulado("res/mapa50x50.png", solucion, 4);
		
		valTemple=monticulo.val(temple, "res/mapa50x50.png");
		System.out.println("Valoracion: " + valTemple);
		//System.out.println(temple.toString2(50, 50));
		System.out.println(temple.toString3());
		
		
		
		/* 100x100 ----------------------------------------------------------------------- */
		/* Analiza una solucion dibujada en una imagen */
		System.out.println("Analizando Solucion");
		solucion=monticulo.getSolucion("res/solucion100x100.png");
		System.out.println("----------------------------\nValorando Solucion");
		valoracion=monticulo.val(solucion, "res/mapa100x100.png");
		System.out.println("Valoracion: " + valoracion);
		//System.out.println(solucion.toString2(100, 100));
		
		/* Se le aplica el algoritmo del ascenso de colinas */
		System.out.println("---------------------------------\nAscenso de colinas\n---------------------------------");
		colinas=monticulo.ascensoColinas("res/mapa100x100.png", solucion);
		
		valColinas=monticulo.val(colinas, "res/mapa100x100.png");
		System.out.println("Valoracion: " + valColinas);
		//System.out.println(colinas.toString2(100, 100));
		System.out.println(colinas.toString3());
		
		/* Se le aplica el algoritmo del temple simulado */  
		System.out.println("---------------------------------\nTemple Simulado\n---------------------------------");
		temple=monticulo.templeSimulado("res/mapa100x100.png", solucion, 10);
		
		valTemple=monticulo.val(temple, "res/mapa100x100.png");
		System.out.println("Valoracion: " + valTemple);
		//System.out.println(temple.toString2(100, 100));
		System.out.println(temple.toString3());
		
	}
	
}
